
#include <machine/asm.h>
ENTRY(bzero)
	movl	%d2,-(%sp)
	movl	8(%sp),%a0		| destination
	movl	12(%sp),%d1		| count

	clrl	%d2

	/* 
	 * It isn't worth the overhead of aligning to {long}word boundries
	 * if the string is too short.
	 */
	cmpl	#8,%d1
	jlt	.Lbzbyte

	/* word align */
	movl	%a0,%d0
	btst	#0,%d0			| if (dst & 1)
	jeq	.Lbzalgndw		| 
	movb	%d2,(%a0)+		| 	*(char *)dst++ = 0
	subql	#1,%d1			|	len--
.Lbzalgndw:
	/* long word align */
	btst	#1,%d0			| if (dst & 2)
	jeq	.Lbzalgndl		|
	movw	%d2,(%a0)+		|	*(short *)dst++ = 0
	subql	#2,%d1			|	len -= 2
.Lbzalgndl:
	/* zero by 8 longwords */
	movel	%d1,%d0
	lsrl	#5,%d0			| cnt = len / 32
	jeq	.Lbzlong		| if (cnt)
	andl	#31,%d1			|	len %= 32
	subql	#1,%d0			|	set up for dbf
.Lbz32loop:
	movl	%d2,(%a0)+		|	zero 8 long words
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
	movl	%d2,(%a0)+
#ifndef __mcoldfire__
	dbf	%d0,.Lbz32loop		|	till done
	clrw	%d0
#endif
	subql	#1,%d0
	jcc	.Lbz32loop

.Lbzlong:
	/* copy by longwords */
	movel	%d1,%d0
	lsrl	#2,%d0			| cnt = len / 4
	jeq	.Lbzbyte		| if (cnt)
	subql	#1,%d0			|	set up for dbf
.Lbzlloop:
	movl	%d2,(%a0)+		|	clear longwords
#ifdef __mcoldfire__
	subql	#1,%d0			|	decrement
	jcc	.Lbzlloop		|	till done
#else
	dbf	%d0,.Lbzlloop		|	till done
#endif
	andl	#3,%d1			|	len %= 4
	jeq	.Lbzdone

	subql	#1,%d1			| set up for dbf
.Lbzbloop:
	movb	%d2,(%a0)+		| zero bytes
.Lbzbyte:
#ifdef __mcoldfire__
	subql	#1,%d0			| decrement
	jcc	.Lbzbloop		| till done
#else
	dbf	%d1,.Lbzbloop		| till done
#endif
.Lbzdone:
	movl	(%sp)+,%d2
	rts
END(bzero)
